package br.com.os2.pacemark.dao;

import br.com.os2.pacemark.connection.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Classe DAOGenerico é responsável por prover recursos comuns a todos os outros
 * DAO's. Evita a duplicação de códigos. Provê métodos para execução de
 * consultas SQL's no banco de dados.
 *
 * @author Daniel
 *
 */
public class DAOGenerico {

    /**
     *
     * Várialvel Connection inicializada no construtor, recebendo uma conexão
     * com o banco de dados.
     *
     */
    protected Connection connection;

    /**
     * Método para retornar um PreparedStatement, que será utilizado em
     * consultas e execuções de comandos sql.
     *
     * @param sql consulta ou comando sql a ser executado.
     *
     * @return PreparedStatement
     *
     *
     */
    private PreparedStatement getPreparedStatement(String sql) {

        connection = ConnectionFactory.getConnection();

        PreparedStatement ps = null;

        try {

            ps = connection.prepareStatement(sql);

        } catch (SQLException ex) {

            System.err.println("ERRO AO OBTER PREPARED_STATEMENT");

        }

        return ps;

    }

    /**
     * Método para a execução de consultas SQL's.
     *
     * Utilizado em listagense e pesquisas.
     *
     * @param sql consulta a ser realizada.
     * @param parametros parametros para a execução da consulta.
     *
     * @return ResultSet resultado da consulta executada pelo método
     *
     *
     */
    public ResultSet executarConsulta(String sql, Object... parametros) {

        PreparedStatement ps = getPreparedStatement(sql);

        ResultSet rs = null;

        try {

            for (int i = 0; i < parametros.length; i++) {

                ps.setObject(i + 1, parametros[i]);

            }

            rs = ps.executeQuery();
            

        } catch (SQLException ex) {

            System.err.println("ERRO AO EXECUTAR CONSULTA");

        }

        return rs;

    }

    /**
     * Método para a execução de comandos SQL's.
     *
     * Utilizado para incluir, alterar ou remover registros.
     *
     * @param sql comando a ser executado.
     * @param parametros parametros para a execução do comando.
     *
     * @return boolean indica se o comando foi executado com sucesso.
     *
     *
     */
    public boolean executarComando(String sql, Object... parametros) {

        PreparedStatement ps = getPreparedStatement(sql);

        boolean result = false;

        try {

            for (int i = 0; i < parametros.length; i++) {

                ps.setObject(i + 1, parametros[i]);

            }

            result = ps.execute();

        } catch (SQLException ex) {

            System.err.println("ERRO AO EXECUTAR COMANDO: " + ex);

        } finally {

            try {

                ps.close();
                connection.close();

            } catch (SQLException ex) {

            }

        }

        return result;

    }

    public Integer getNextId(String table) {

        Integer retorno = 1;

        try {
            ResultSet rs = executarConsulta("SELECT MAX(id) FROM " + table);

            rs.next();

            Object result = rs.getObject(1);

            if (result != null) {
                
                rs.close();
                retorno = ((Integer)result) + 1;
                
            }
        } catch (SQLException ex) {

        }

        return retorno;
        
    }

}
